/*
  
  main.c
  
  Generate pictures for the u8g2 reference manual.
  
  
  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)

  Copyright (c) 2016, olikraus@gmail.com
  All rights reserved.

  Redistribution and use in source and binary forms, with or without modification, 
  are permitted provided that the following conditions are met:

  * Redistributions of source code must retain the above copyright notice, this list 
    of conditions and the following disclaimer.
    
  * Redistributions in binary form must reproduce the above copyright notice, this 
    list of conditions and the following disclaimer in the documentation and/or other 
    materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
  
*/

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "u8x8.h"
#include "u8g2.h"



extern uint8_t tga_is_transparent;

extern uint8_t tga_desc_fg_r;
extern uint8_t tga_desc_fg_g;
extern uint8_t tga_desc_fg_b;

extern uint8_t tga_desc_bg_r;
extern uint8_t tga_desc_bg_g;
extern uint8_t tga_desc_bg_b;

extern uint8_t tga_lcd_fg_r;
extern uint8_t tga_lcd_fg_g;
extern uint8_t tga_lcd_fg_b;

extern uint8_t tga_lcd_bg_r;
extern uint8_t tga_lcd_bg_g;
extern uint8_t tga_lcd_bg_b;

extern void tga_save_png(const char *name);

u8x8_t u8x8;
u8g2_t u8g2;
u8g2_t desc;

#define u8g2_logo_97x51_width 97
#define u8g2_logo_97x51_height 51
static unsigned char u8g2_logo_97x51_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x3c, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00,
   0x00, 0x00, 0x3c, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
   0x03, 0x00, 0x00, 0x3c, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0xff, 0x03, 0x00, 0x00, 0x3c, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x80, 0xcf, 0x07, 0x00, 0x00, 0x3c, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x80, 0x83, 0x07, 0x00, 0x00, 0x3c, 0x80, 0x07, 0xf8, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x3c, 0x80, 0x07, 0xfc, 0x03,
   0x1c, 0x00, 0x3e, 0x1c, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x80, 0x07, 0xff,
   0x07, 0x7f, 0x80, 0xff, 0x3f, 0xe0, 0x01, 0x00, 0x00, 0x3c, 0x80, 0x07,
   0xff, 0x8f, 0xff, 0xc1, 0xff, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x80,
   0x87, 0xff, 0xdf, 0xff, 0xc1, 0xc3, 0x07, 0x7c, 0x00, 0x00, 0x00, 0x3c,
   0x80, 0x87, 0x0f, 0xfe, 0xff, 0xe3, 0x81, 0x03, 0x1e, 0x00, 0x00, 0x00,
   0x3c, 0x80, 0xc7, 0x07, 0xfc, 0xe3, 0xe3, 0x81, 0x07, 0x0f, 0x00, 0x00,
   0x00, 0x3c, 0x80, 0xc7, 0x07, 0xf8, 0xc1, 0xe7, 0x81, 0x87, 0xff, 0x07,
   0x00, 0x00, 0x3c, 0x80, 0xc7, 0x03, 0xf0, 0x80, 0xe7, 0xc3, 0x87, 0xff,
   0x07, 0x00, 0x00, 0x3c, 0x80, 0xc7, 0x03, 0x70, 0x80, 0xc7, 0xe7, 0x83,
   0xff, 0x07, 0x00, 0x00, 0x3c, 0x80, 0xc7, 0x03, 0x78, 0x80, 0xc7, 0xff,
   0x03, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x80, 0xc7, 0x03, 0xf8, 0xc0, 0x87,
   0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x80, 0xc7, 0x07, 0xfc, 0xc1,
   0xc7, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xc0, 0x87, 0x0f, 0xfe,
   0xff, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xc0, 0x83, 0xff,
   0xdf, 0xff, 0xe3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf1, 0x03,
   0xff, 0x8f, 0xff, 0xe1, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
   0x01, 0xfe, 0x0f, 0xff, 0xc0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0,
   0xff, 0x00, 0xfc, 0x03, 0x7c, 0xc0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00,
   0x80, 0x3f, 0x00, 0xf8, 0x01, 0x00, 0xe0, 0x01, 0x1e, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf0, 0xc7, 0x0f,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0xff,
   0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0,
   0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
   0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff,
   0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x24, 0x20, 0x00,
   0x00, 0x08, 0x46, 0x02, 0x00, 0x80, 0xc0, 0x40, 0x00, 0x0c, 0x6e, 0x6a,
   0xc0, 0xa4, 0x48, 0x04, 0xaa, 0xac, 0x8c, 0xaa, 0xac, 0x00, 0x6a, 0xa4,
   0xaa, 0x20, 0xea, 0xa4, 0x64, 0x66, 0xaa, 0x46, 0x4a, 0x8a, 0x00, 0x4c,
   0xa4, 0xaa, 0x20, 0xaa, 0xa2, 0x44, 0x2a, 0xaa, 0x28, 0xaa, 0x4c, 0x00,
   0xe8, 0xa8, 0x6c, 0xc4, 0xa4, 0x42, 0xee, 0x2a, 0xcc, 0x26, 0x6c, 0xe8,
   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00 };


void ra(uint16_t tx, uint16_t ty, const char *s)
{
  int x,y, i, w;
  x = tx*3+64*3 + 0;
  y = ty*3+32*3 + 1;
  for( i = 0; i < 6; i++)
  {
    u8g2_DrawHVLine(&desc, x-2*i, y-i, 1+2*i, 1);
    u8g2_DrawHVLine(&desc, x-2*i-1, y-i, 1+2*i, 1);
  }
  u8g2_DrawHVLine(&desc, x-30, y-1, 28, 0);
  u8g2_DrawHVLine(&desc, x-30, y, 20, 0);
  u8g2_DrawHVLine(&desc, x-30, y+1, 28, 0);

  w = u8g2_GetStrWidth(&desc, s);
  u8g2_DrawStr(&desc, x-34-w, y+u8g2_GetAscent(&desc)/2, s);
  
  
}

/* vertical measure */
/* tx,ty: lower point */
void vm(uint16_t tx, uint16_t ty, uint16_t dy)
{
  char s[10];
  
  int x,y, i, w;
  x = tx*3+64*3 + 1;
  y = ty*3+32*3 +3;
  
  u8g2_DrawHVLine(&desc, x-3, y-1, 7, 0);
  u8g2_DrawHVLine(&desc, x, y-dy*3, dy*3, 1);
  u8g2_DrawHVLine(&desc, x-3, y-dy*3, 7, 0);

  sprintf(s, "%d", dy);
  w = u8g2_GetStrWidth(&desc, s);
  u8g2_DrawStr(&desc, x+6, y-(dy*3)/2+u8g2_GetAscent(&desc)/2, s);
}

/* horizontal measure */
/* tx,ty: left point */
void hm(uint16_t tx, uint16_t ty, uint16_t dx)
{
  char s[10];
  
  int x,y, i, w;
  x = tx*3+64*3 + 1;
  y = ty*3+32*3 +3;
  
  u8g2_DrawHVLine(&desc, x-1, y-3, 7, 1);
  u8g2_DrawHVLine(&desc, x, y, dx*3-1, 0);
  u8g2_DrawHVLine(&desc, x+(dx-1)*3+1, y-3, 7, 1);

  sprintf(s, "%d", dx);
  w = u8g2_GetStrWidth(&desc, s);
  u8g2_DrawStr(&desc, x+(dx*3)/2-w/2, y+6+u8g2_GetAscent(&desc), s);
}

int main(void)
{
  /*
  tga_desc_fg_r = 100;
  tga_desc_fg_g = 118;
  tga_desc_fg_b = 135;
  */

  tga_desc_fg_r = 76;
  tga_desc_fg_g = 0;
  tga_desc_fg_b = 205;

  tga_desc_bg_r = 255;
  tga_desc_bg_g = 255;
  tga_desc_bg_b = 255;

  tga_lcd_fg_r = 0;
  tga_lcd_fg_g = 0;
  tga_lcd_fg_b = 0;

  tga_lcd_bg_r = 250;
  tga_lcd_bg_g = 193;
  tga_lcd_bg_b = 50;

  /*
  u8x8_Setup_TGA_DESC(&desc);
  u8x8_InitDisplay(&desc);  
  u8x8_SetPowerSave(&desc, 0);
  u8x8_ClearDisplay(&desc);
  u8x8_SetFont(&desc, u8x8_font_amstrad_cpc_extended_r);
  u8x8_DrawString(&desc, 0, 0, "Description");
*/

  u8g2_SetupBuffer_TGA_DESC(&desc, &u8g2_cb_r0);
  u8g2_InitDisplay(&desc);  
  u8g2_SetPowerSave(&desc, 0);
  u8g2_ClearDisplay(&desc);


  u8g2_SetupBuffer_TGA_LCD(&u8g2, &u8g2_cb_r0);
  u8g2_InitDisplay(&u8g2);  
  u8g2_SetPowerSave(&u8g2, 0);
  u8g2_ClearDisplay(&u8g2);



  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB14_tf);
    u8g2_DrawStr(&u8g2, 0, 15, "Hello World!");
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(0,15, "x=0, y=15");
  } while( u8g2_NextPage(&desc) );
  tga_is_transparent = 0;

  tga_save_png("u8g2_hello_world.png");

/*=========================================*/
/* u8g2_ascent_descent.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 
  
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    u8g2_DrawStr(&u8g2, 5, 20, "A  gi");
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(5,20, "x=5, y=20");
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    vm(25,19, u8g2_GetAscent(&u8g2));
    
    /* descent usually is negative */
    vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  tga_is_transparent = 0;

  tga_save_png("u8g2_ascent_descent.png");

  /*=========================================*/
  /* u8g2_pos_center.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    u8g2_DrawStr(&u8g2, 5, 20, "Agi");
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(5,20, "x=5, y=20");
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    /* descent usually is negative */
    vm(48,19+u8g2.font_calc_vref(&u8g2)-u8g2_GetDescent(&u8g2), u8g2_GetAscent(&u8g2)-u8g2_GetDescent(&u8g2));
    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_pos_center.png");

/*=========================================*/

  u8x8_ClearDisplay(u8g2_GetU8x8(&desc));
  
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);
    u8g2_DrawGlyph(&u8g2, 5, 20, 0x2603);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(5,20, "x=5, y=20");
  } while( u8g2_NextPage(&desc) );
  tga_is_transparent = 0;

  tga_save_png("u8g2_snowman_glyph.png");

/*=========================================*/

  u8x8_ClearDisplay(u8g2_GetU8x8(&desc));
  
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);
    u8g2_DrawUTF8(&u8g2, 5, 20, "Snowman: ☃");
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(5,20, "x=5, y=20");
  } while( u8g2_NextPage(&desc) );
  tga_is_transparent = 0;

  tga_save_png("u8g2_snowman_utf8.png");

/*=========================================*/

  u8x8_ClearDisplay(u8g2_GetU8x8(&desc));
  
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFontMode(&u8g2, 1);	/* transparent */
    
    u8g2_SetFontDirection(&u8g2, 0);
    u8g2_SetFont(&u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(&u8g2, 0, 30, "U");
    
    u8g2_SetFontDirection(&u8g2, 1);
    u8g2_SetFont(&u8g2, u8g2_font_inb30_mr);
    u8g2_DrawStr(&u8g2, 21, 8,"8");
        
    u8g2_SetFont(&u8g2, u8g2_font_inb24_mf);
    u8g2_SetFontDirection(&u8g2, 0);
    u8g2_DrawStr(&u8g2, 51,30,"g");
    u8g2_DrawStr(&u8g2, 67,30,"\xb2");
    
    u8g2_DrawHLine(&u8g2, 2, 35, 47);
    u8g2_DrawHLine(&u8g2, 3, 36, 47);
    u8g2_DrawVLine(&u8g2, 45, 32, 12);
    u8g2_DrawVLine(&u8g2, 46, 33, 12);
    
    u8g2_SetFont(&u8g2, u8g2_font_4x6_tr);
    u8g2_DrawStr(&u8g2, 1,54,"github.com/olikraus/u8g2");
    
  } while( u8g2_NextPage(&u8g2) );

  u8g2_SetFontDirection(&u8g2, 0);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
  } while( u8g2_NextPage(&desc) );
  tga_is_transparent = 0;

  tga_save_png("u8g2_logo.png");

  /*=========================================*/
  /* u8g2_box.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    u8g2_DrawBox(&u8g2, 3, 7, 25, 15);
    //u8g2_DrawFrame(&u8g2, 60, 40, 16, 9);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(3,7, "x=3, y=7");
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    /* descent usually is negative */
    vm(3+25+2,7+15-1, 15);
    hm(3, 7+15+1, 25);

    //ra(60,40, "x=60, y=40");
    //vm(60+16+2,40+9-1, 9);
    //hm(60, 40+9+1, 16);
    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_box.png");

  /*=========================================*/
  /* u8g2_frame.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    u8g2_DrawFrame(&u8g2, 3, 7, 25, 15);
    //u8g2_DrawFrame(&u8g2, 60, 40, 16, 9);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(3,7, "x=3, y=7");
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    /* descent usually is negative */
    vm(3+25+2,7+15-1, 15);
    hm(3, 7+15+1, 25);

    //ra(60,40, "x=60, y=40");
    //vm(60+16+2,40+9-1, 9);
    //hm(60, 40+9+1, 16);
    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_frame.png");

  /*=========================================*/
  /* u8g2_ellipse.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    //u8g2_DrawEllipse(&u8g2, 20, 25, 15, 10, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT|U8G2_DRAW_LOWER_RIGHT);
    u8g2_DrawEllipse(&u8g2, 20, 25, 15, 10, U8G2_DRAW_ALL);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,25, "x=20, y=25");
    /* descent usually is negative */
    vm(20+15+1, 25-1, 10);
    vm(20+15+1+13, 25+10, 21);
    hm(20+1, 25+10+1, 15);
    hm(20-15, 25+10+1+11, 31);

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_ellipse.png");

  /*=========================================*/
  /* u8g2_circle.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    //u8g2_DrawEllipse(&u8g2, 20, 25, 15, 10, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT|U8G2_DRAW_LOWER_RIGHT);
    u8g2_DrawCircle(&u8g2, 20, 25, 10, U8G2_DRAW_ALL);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,25, "x=20, y=25");
    /* descent usually is negative */
    vm(20+15+1, 25-1, 10);
    vm(20+15+1+13, 25+10, 21);
    hm(20+1, 25+10+1, 10);
    hm(20-10, 25+10+1+11, 21);

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_circle.png");

  /*=========================================*/
  /* u8g2_rframe.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    //u8g2_DrawEllipse(&u8g2, 20, 25, 15, 10, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT|U8G2_DRAW_LOWER_RIGHT);
    u8g2_DrawRFrame(&u8g2, 20, 15, 30, 22, 7);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,15, "x=20, y=15");
    /* descent usually is negative */
    vm(20+30+1, 15+22-1, 7);
    vm(20+30+1+8, 15+22-1, 22);
    hm(20+30-7, 15+22+1, 7);
    hm(20, 15+22+1+11, 30);

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_rframe.png");


  /*=========================================*/
  /* u8g2_triangle.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB18_tf);
    u8g2_DrawTriangle(&u8g2, 20, 5, 27, 50, 5, 32);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,5, "x=20, y=5");
    ra(27,50, "x=27, y=50");
    ra(5,32, "x=5, y=32");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_triangle.png");

  /*=========================================*/
  /* u8g2_line.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_DrawLine(&u8g2, 20, 5, 5, 32);
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,5, "x=20, y=5");
    ra(5,32, "x=5, y=32");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_line.png");

  /*=========================================*/
  /* u8g2_font_direction.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetFont(&u8g2, u8g2_font_ncenB14_tf);
    u8g2_SetFontDirection(&u8g2, 0);
    u8g2_DrawStr(&u8g2, 15, 20, "Abc");
    u8g2_SetFontDirection(&u8g2, 1);
    u8g2_DrawStr(&u8g2, 15, 20, "Abc");
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(15,20, "x=15, y=20");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);

  tga_save_png("u8g2_font_direction.png");

  
  /*=========================================*/
  /* u8g2_xor.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontMode(&u8g2, 1);
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_DrawBox(&u8g2, 22, 2, 35, 50);
    u8g2_SetFont(&u8g2, u8g2_font_ncenB14_tf);
    u8g2_SetDrawColor(&u8g2, 0);
    u8g2_DrawStr(&u8g2, 5, 18, "abcd");
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_DrawStr(&u8g2, 5, 33, "abcd");
    u8g2_SetDrawColor(&u8g2, 2);
    u8g2_DrawStr(&u8g2, 5, 48, "abcd");
  } while( u8g2_NextPage(&u8g2) );
  u8g2_SetDrawColor(&u8g2, 1);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(5,15, "color 0");
    ra(5,30, "color 1");
    ra(5,45, "color 2");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);

  tga_save_png("u8g2_xor.png");


/*=========================================*/
/* u8g2_bitmap_solid.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontMode(&u8g2, 1);
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_SetBitmapMode(&u8g2, 0);
    u8g2_DrawXBM(&u8g2, 4,3, u8g2_logo_97x51_width, u8g2_logo_97x51_height,  u8g2_logo_97x51_bits);
    u8g2_DrawXBM(&u8g2, 12,11, u8g2_logo_97x51_width, u8g2_logo_97x51_height,  u8g2_logo_97x51_bits);
  } while( u8g2_NextPage(&u8g2) );
  u8g2_SetDrawColor(&u8g2, 1);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(4,3, "(4, 3)");
    ra(12,11, "(12, 11)");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);

  tga_save_png("u8g2_bitmap_solid.png");


  /*=========================================*/
/* u8g2_bitmap_transparent.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontMode(&u8g2, 1);
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_SetBitmapMode(&u8g2, 1);
    u8g2_DrawXBM(&u8g2, 4,3, u8g2_logo_97x51_width, u8g2_logo_97x51_height,  u8g2_logo_97x51_bits);
    u8g2_DrawXBM(&u8g2, 12,11, u8g2_logo_97x51_width, u8g2_logo_97x51_height,  u8g2_logo_97x51_bits);
  } while( u8g2_NextPage(&u8g2) );
  u8g2_SetDrawColor(&u8g2, 1);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(4,3, "(4, 3)");
    ra(12,11, "(12, 11)");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);

  tga_save_png("u8g2_bitmap_transparent.png");


  /*=========================================*/
  /* u8g2_color.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_uint_t x,y;
    u8g2_SetDrawColor(&u8g2, 1);
    for( y = 0; y < u8g2_GetDisplayHeight(&u8g2); y++ )
      for( x = 0; x < u8g2_GetDisplayWidth(&u8g2); x++ )
	if ( (x ^ y) & 1 )
	  u8g2_DrawPixel(&u8g2, x, y);
        
    u8g2_SetFont(&u8g2, u8g2_font_9x15B_mf);
    
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_DrawStr(&u8g2, 3, 20, "Color = 1");
    u8g2_SetDrawColor(&u8g2, 0);
    u8g2_DrawStr(&u8g2, 3, 40, "Color = 0");
  } while( u8g2_NextPage(&u8g2) );

  u8g2_SetDrawColor(&u8g2, 1);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    ra(3,20, "x=3, y=20");
    ra(3,40, "x=3, y=40");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_color.png");

  
  /*=========================================*/
  /* u8g2_fontmode.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosCenter(&u8g2);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_uint_t x,y;
    u8g2_SetDrawColor(&u8g2, 1);
    for( y = 0; y < u8g2_GetDisplayHeight(&u8g2); y++ )
      for( x = 0; x < u8g2_GetDisplayWidth(&u8g2); x++ )
	if ( (x ^ y) & 1 )
	  u8g2_DrawPixel(&u8g2, x, y);
        
    u8g2_SetFont(&u8g2, u8g2_font_8x13B_mf);
    
    u8g2_SetFontMode(&u8g2, 0);
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_DrawStr(&u8g2, 3, 15, "Color=1, Mode 0");
    u8g2_SetDrawColor(&u8g2, 0);
    u8g2_DrawStr(&u8g2, 3, 30, "Color=0, Mode 0");

    u8g2_SetFontMode(&u8g2, 1);
    u8g2_SetDrawColor(&u8g2, 1);
    u8g2_DrawStr(&u8g2, 3, 45, "Color=1, Mode 1");
    u8g2_SetDrawColor(&u8g2, 0);
    u8g2_DrawStr(&u8g2, 3, 60, "Color=0, Mode 1");
  } while( u8g2_NextPage(&u8g2) );

  u8g2_SetDrawColor(&u8g2, 1);
  u8g2_SetFontMode(&u8g2, 1);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    ra(3,15, "x=3, y=15");
    ra(3,30, "x=3, y=30");
    ra(3,45, "x=3, y=45");
    ra(3,60, "x=3, y=60");

    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);

  tga_save_png("u8g2_fontmode.png");

  /*=========================================*/
  /* u8g2_message.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFont(&u8g2, u8g2_font_6x10_tf);
  u8g2_SetFontRefHeightAll(&u8g2);  /* this will add some extra space for the text inside the buttons */
  
  u8g2_UserInterfaceMessage(&u8g2, "Title1", "Title2", "Title3", " Ok \n Cancel ");
  
  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    /*
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,5, "x=20, y=5");
    ra(27,50, "x=27, y=50");
    ra(5,32, "x=5, y=32");
    */
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontRefHeightText(&u8g2);

  tga_save_png("u8g2_message.png");

  /*=========================================*/
  /* u8g2_selection_list.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFont(&u8g2, u8g2_font_6x10_tf);
  u8g2_SetFontRefHeightAll(&u8g2);  /* this will add some extra space for the text inside the buttons */
  
  u8g2_UserInterfaceSelectionList(&u8g2, "Title", 1, "abcdef\nghijkl\nmnopqr");
  
  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    /*
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,5, "x=20, y=5");
    ra(27,50, "x=27, y=50");
    ra(5,32, "x=5, y=32");
    */
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontRefHeightText(&u8g2);

  tga_save_png("u8g2_selection_list.png");

  /*=========================================*/
  /* u8g2_input_value.png */
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFont(&u8g2, u8g2_font_6x10_tf);
  u8g2_SetFontRefHeightAll(&u8g2);  /* this will add some extra space for the text inside the buttons */
  
  {
    uint8_t v = 4;
    u8g2_UserInterfaceInputValue(&u8g2, "Select Voltage", "DAC= ", &v, 0, 5, 1, " V");
  }
  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    /*
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(20,5, "x=20, y=5");
    ra(27,50, "x=27, y=50");
    ra(5,32, "x=5, y=32");
    */
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontRefHeightText(&u8g2);

  tga_save_png("u8g2_input_value.png");

  /*=========================================*/
  /* u8g2_clip_window.png */

  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 

  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFont(&u8g2, u8g2_font_ncenB24_tf);
  u8g2_SetClipWindow(&u8g2, 10, 10, 85, 30);
  u8g2_SetDrawColor(&u8g2, 1);
  u8g2_FirstPage(&u8g2);
  do
  {
    u8g2_DrawStr(&u8g2, 3, 32, "U8g2");
  } while( u8g2_NextPage(&u8g2) );

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(10,10, "(10, 10)");
    ra(85,30, "(85, 30)");
    ra(3,32, "(3, 32)");
    hm(10, 35, 75);
    vm(88, 29, 20);
    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);
  u8g2_SetMaxClipWindow(&u8g2);

  tga_save_png("u8g2_clip_window.png");
  
  /*=========================================*/
  /* u8g2_tile_row.png */

  u8x8_ClearDisplay(u8g2_GetU8x8(&desc)); 
  
  u8g2_FirstPage(&u8g2);
  do
  {
  } while( u8g2_NextPage(&u8g2) );
  

  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetDrawColor(&u8g2, 1);
  
  u8g2_SetBufferCurrTileRow(&u8g2, 0);
  u8g2_SetFont(&u8g2, u8g2_font_helvB08_tr);
  u8g2_DrawStr(&u8g2, 2, 8, "abcdefg");
  
  u8g2_SetBufferCurrTileRow(&u8g2, 2);
  u8g2_SendBuffer(&u8g2);
  u8g2_SetBufferCurrTileRow(&u8g2, 4);
  u8g2_SendBuffer(&u8g2);

  tga_is_transparent = 1;
  u8g2_FirstPage(&desc);
  do
  {
    u8g2_SetFont(&desc, u8g2_font_helvB18_tf);
    ra(2,8, "(2, 8)");
    ra(2,24, "(2, 24)");
    ra(2,40, "(2, 40)");
    //hm(10, 35, 75);
    //vm(88, 29, 20);
    
    //vm(62,19-u8g2_GetDescent(&u8g2), -u8g2_GetDescent(&u8g2));
  } while( u8g2_NextPage(&desc) );
  
  tga_is_transparent = 0;
  u8g2_SetFontPosBaseline(&u8g2);
  u8g2_SetFontDirection(&u8g2, 0);

  tga_save_png("u8g2_tile_row.png");
  
  /*=========================================*/
  
  u8x8_ClearDisplay(u8g2_GetU8x8(&desc));

  return 0;
}

